<?php

namespace App\Components;

use ReflectionFunction;

class DXUtil
{

    /**
     * 封装的处理数据库查询数据的方法
     *
     * @param array $itemList 入参需要是普通数组，不能是对象数组
     * @param callable|null $callback
     * @return array
     * @throws \ReflectionException
     */
    public static function formatModelList(array $itemList, callable $callback = null): array
    {
        $result = [];

        // 使用反射获取匿名函数参数的数量
        if ($callback) {
            $reflection = new ReflectionFunction($callback);
            $parameterCount = $reflection->getNumberOfParameters();

            foreach ($itemList as $index => $item) {

                if ($parameterCount == 1) {
                    $processItem = $callback($item);
                } else if ($parameterCount == 2) {
                    $processItem = $callback($index, $item);
                } else {
                    throw new \InvalidArgumentException("Callback must accept 1 or 2 parameters.");
                }

                if (is_array($processItem)) {
                    $result[] = $processItem;
                } else {
                    throw new \InvalidArgumentException("Callback must return an array.");
                }
            }
        } else {
            $result = $itemList;
        }

        return $result;
    }

}
